﻿using System;
using System.Collections;
using System.Collections.Generic;

namespace CoreHelper
{
    /// <summary>
    /// 枚举帮助类
    /// </summary>
    public class EnumHelper
    {
        #region 存储枚举的键值对对象
        /// <summary>
        /// 存储枚举的键值对对象
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <typeparam name="S"></typeparam>
        public class KVP<T, S>
        {
            /// <summary>
            /// Key
            /// </summary>
            public int Key { get; set; }
            /// <summary>
            /// Value
            /// </summary>
            public string Value { get; set; }

            /// <summary>
            /// 
            /// </summary>
            /// <param name="k"></param>
            /// <param name="v"></param>
            public KVP(int k, string v)
            {
                this.Key = k;
                this.Value = v;
            }
        }
        #endregion

        #region 将枚举转换为Hashtable;T为枚举名称
        /// <summary>
        /// 将枚举转换为Hashtable;T为枚举名称
        /// </summary>
        /// <typeparam name="T">T为枚举名称</typeparam>
        /// <returns></returns>
        public Hashtable EnumToHashtable<T>()
        {
            Hashtable has = new Hashtable();
            foreach (int i in Enum.GetValues(typeof(T)))
            {
                has.Add(i.ToString(), Enum.GetName(typeof(T), i));
            }
            return has;
        }
        #endregion

        #region 将枚举转换为泛型类;T为枚举名称
        /// <summary>
        /// 将枚举转换为泛型类;T为枚举名称
        /// </summary>
        /// <typeparam name="T">T为枚举名称</typeparam>
        /// <returns></returns>
        public static List<KVP<int, string>> EnumToList<T>()
        {
            List<KVP<int, string>> list = new List<KVP<int, string>>();
            foreach (int i in Enum.GetValues(typeof(T)))
            {
                KVP<int, string> tmp = new KVP<int, string>(i, Enum.GetName(typeof(T), i));
                list.Add(tmp);
            }
            return list;
        }
        #endregion

        #region 通过枚举的值获取对应的枚举变量
        /// <summary>
        /// 通过枚举的值获取对应的枚举变量
        /// </summary>
        /// <typeparam name="T">枚举名称</typeparam>
        /// <param name="key">键</param>
        /// <returns></returns>
        public static string GetEnumVariable<T>(int key)
        {
            Hashtable hs = new Hashtable();
            foreach (int i in Enum.GetValues(typeof(T)))
            {
                hs.Add(i, Enum.GetName(typeof(T), i));
            }
            return hs[key].ToString();
        }
        #endregion

        #region 通过枚举的值获取对应的枚举变量
        //public static IEnumerable GetEnumVariable<T>(int key)
        //{
        //    foreach (int i in Enum.GetValues(typeof(T)))
        //    {
        //        if (i == key)
        //        {
        //            yield return Enum.GetName(typeof(T), i);
        //            break;
        //        }
        //    }
        //} 
        #endregion
    }
}